#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5,maxm=2e6+5;
char s[maxn],w[25][maxn];
int len[25],cur[25];
struct ACAM
{
	int	tot,tag[maxm],nxt[maxm][26],fail[maxm];
	void clear()
	{	tot=0,newnode(); }
	int newnode()
	{
		memset(nxt[tot],0,sizeof(nxt[tot]));
		return tag[tot]=fail[tot]=0,tot++;
	}
	void insert(char *s,int id)
	{
		int len=strlen(s),pt=0;
		for(int i=0;i<len;i++)
		{
			int to=s[i]-'a';
			if(!nxt[pt][to])
				nxt[pt][to]=newnode();
			pt=nxt[pt][to];
		}
		tag[pt]|=1<<id;
	}
	void getfail()
	{
		queue<int>que;
		for(int i=0;i<26;i++)
			if(nxt[0][i]) que.push(nxt[0][i]);
		while(!que.empty())
		{
			int u=que.front(); que.pop();
			for(int i=0;i<26;i++)
			{
				int v=nxt[u][i],f=fail[u],fnxt=nxt[f][i];
				if(v) fail[v]=fnxt,que.push(v),tag[v]|=tag[fnxt];
				else nxt[u][i]=fnxt;
			}
		}
	}
}acam;
bool check(int m,int pos)
{
	int ok=1;
	for(int i=0;i<m;i++)
		ok&=cur[i]>=pos;
	return ok;
}
int main()
{	
	int t,n,m,k;
	scanf("%d",&t);
	while(t--)
	{	
		scanf("%d%d%d%s",&n,&m,&k,s);
		acam.clear();
		for(int i=0;i<m;i++)
		{
			scanf("%s",w[i]);
			len[i]=strlen(w[i]);
			acam.insert(w[i],i);
		}
		acam.getfail();
		int pt=0,ans=0;
		memset(cur,-1,sizeof(cur));
		for(int i=0;i<n;i++)
		{
			int to=s[i]-'a';
			pt=acam.nxt[pt][to];
			for(int j=0;j<m;j++)
				if(acam.tag[pt]&(1<<j))
					cur[j]=i-len[j]+1;
			if(i>=k-1&&check(m,i-k+1)) ans++;	
		}
		printf("%d\n",ans);
	}
}